package astar.controller;

import javax.swing.JFrame;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.awt.Point;

//imports de outros packages
import astar.model.ReadImage;
import astar.model.AStar;
import astar.model.Calc;
import astar.view.WriteImage;

/**
* 
* @author Artur Ataide, Andre Ventura
* @date Junho 2014
*
*/
public class Main extends JFrame {

	/**
	*
	* Construtor da classe Main que é inicializa no método main. Neste construtor
	* é inicializado e controlado o fluxo do programa.
	*
	*/
	public Main() {	
		Calc calc = new Calc();
		String filename = "peppersgrad.pgm";
		//envia a String com o nome do ficheiro para que o mesmo possa ser lido
		ReadImage readImage = new ReadImage(filename);
		this.pathfind(readImage, filename);	
	}

	/**
	*
	* Método que cria um objeto da classe AStar com o objetivo de calcular 
	* o caminho mais rápido entre o ponto inicial e o ponto final. Calcula o tempo
	* dessa execução e chama o método que desenha a imagem bem como esse caminho.
	*
	* @param readImage Objeto da classe ReadImage que contem os pixeis da imagem,
	* bem como a variável BufferedImage, necessária para desenhar a imagem.
	* @param filename String com o caminho do ficheiro a ser lido.
	*/
	private void pathfind(ReadImage readImage, String filename) {
		AStar aStar = new AStar(readImage.getPixels());
		this.drawImg(readImage.getImg(), aStar.getClosedList(), filename);
	}

	/**
	*
	* Método que cria um obejto da classe WriteImage, enviando a BufferedImage,
	* a lista fechada obtida no A* com os pontos a serem desenhados, os segundos
	* gastos co calculo do A* e a String com o caminho do ficheiro.
	*
	* @param img BufferedImage que permite o desenho do ficheiro PGM.
	* @param closedList ArrayList com os pontos da lista fechada obtidos através
	* do algoritmo A*.
	* @param filename Caminho do ficheiro a ser lido.
	*/
	private void drawImg(BufferedImage img, ArrayList<Point> closedList, String filename) {
		WriteImage writeImage = new WriteImage(img, closedList, filename);
		JFrame f = new JFrame("A* Pathfind - Artur Ataide, Andre Ventura");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(writeImage);		
		f.setSize(512, 530);
		f.setVisible(true);
	}	

	/**
	*
	* Primeiro método a ser corrido pelo programa. Onde é inicializado um objeto
	* da clase main.
	*
	* @param args Array de argumentos obtidos pela consola enviados pelo utilizador.
	*/
	public static void main(String[] args) {
		Main m = new Main();
	}

}